﻿
// MachineScheduleDlg.h: 头文件
//

#include"LargeHeap.h"
#include"SmallHeap.h"
#define N 10

#pragma once


//机器结构体
struct MachineNode 
{
	int ID=0;	//机器号
	int avail = 0;	//机器可用时刻
	int jobID = 0;	//机器处理的作业（不在小根堆中同步）
	int takenTime = 0;	//机器将被占用的时间（不在小根堆中同步）

	//运算符重载
	friend bool operator<(MachineNode n1, MachineNode n2)
	{
		return n1.avail < n2.avail;
	}
	friend bool operator>(MachineNode n1, MachineNode n2)
	{
		return n1.avail > n2.avail;
	}
};

//作业结构体
struct JobNode
{
	int ID=0;
	int time=0;

	//运算符重载
	friend bool operator<(JobNode n1, JobNode n2)
	{
		return n1.time < n2.time;
	}
	friend bool operator>(JobNode n1, JobNode n2)
	{
		return n1.time > n2.time;
	}
};


// CMachineScheduleDlg 对话框
class CMachineScheduleDlg : public CDialogEx
{
// 构造
public:
	CMachineScheduleDlg(CWnd* pParent = nullptr);	// 标准构造函数

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_MACHINESCHEDULE_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);

	//时间响应函数
	afx_msg void OnTimer(UINT_PTR nIDEvent);
	
	//按钮点击事件
	afx_msg void OnBnClickedMAdd();
	afx_msg void OnBnClickedMDel();
	afx_msg void OnBnClickedJAdd();
	afx_msg void OnBnClickedJDel();
	afx_msg void OnBnClickedStart();
	afx_msg void OnBnClickedReset();
	afx_msg void OnBnClickedSlow();
	afx_msg void OnBnClickedFast();
	afx_msg void OnBnClickedFastest();
private:
	MachineNode machines[N];	//机器数组
	JobNode jobs[N];	//作业数组
	LargeHeap<JobNode> jobHeap;	//作业大根堆
	SmallHeap<MachineNode> machineHeap;	//机器小根堆
	int mCount = 0;	// 机器数
	int idleCount = 0; //空闲机器数
	int jCount = 0;	// 作业数
	int shortestTime = 0;	//最短调度时间
	bool finished = true;	//任务是否完成
	int interval = 1000;	//计时间隔

	//作业状态指示灯
	// CBitmap对象，用于加载位图
	CBitmap bitmapGray;	//灰色：空作业位
	CBitmap bitmapBlue;	//蓝色：作业未被处理
	CBitmap bitmapRed;	//红色：作业正在被处理
	CBitmap bitmapGreen;	//绿色：作业处理完成

	// 保存CBitmap加载的位图句柄  
	HBITMAP hbmpRed;
	HBITMAP hbmpGreen;
	HBITMAP hbmpGray;
	HBITMAP hbmpBlue;

	CBrush brush_M;	//机器名的画刷

	//增加机器
	void addMachine(int id);

	//移除机器
	void delMachine(int id);

	//增加作业
	void addJob(int id);

	//移除作业
	void delJob(int id);

	//处理作业
	void doJob(int mID, int jID, bool done);

	//设置作业状态指示灯颜色
	void setJobStatus(int id);
};